package legacy

import (
	"encoding/binary"
	"fmt"
)

// Marshal 将数据包序列化为字节数组
func (p *Packet) Marshal() []byte {
	totalLen := int(p.PacketLength)
	buf := make([]byte, totalLen)
	offset := 0
	
	// 起始位 (4字节)
	copy(buf[offset:offset+4], p.StartMarker[:])
	offset += 4
	
	// 序列号 (2字节，小端序)
	binary.LittleEndian.PutUint16(buf[offset:offset+2], p.Sequence)
	offset += 2
	
	// 数据包类型 (1字节)
	buf[offset] = p.PacketType
	offset += 1
	
	// 数据包长度 (4字节，小端序)
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.PacketLength)
	offset += 4
	
	// 字体名称 (32字节)
	copy(buf[offset:offset+32], p.FontName[:])
	offset += 32
	
	// 字号 (4字节，小端序)
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.FontSize)
	offset += 4
	
	// 字宽 (4字节，小端序)
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.FontWidth)
	offset += 4
	
	// 字间隔 (4字节，小端序)
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.CharSpacing)
	offset += 4
	
	// 旋转角度 (4字节，小端序)
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.Rotation)
	offset += 4
	
	// 加粗 (4字节，小端序)
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.Bold)
	offset += 4
	
	// 斜体 (4字节，小端序)
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.Italic)
	offset += 4
	
	// 样式 (4字节，小端序)
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.Style)
	offset += 4
	
	// X坐标 (4字节，小端序)
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.XCoord)
	offset += 4
	
	// Y坐标 (4字节，小端序)
	binary.LittleEndian.PutUint32(buf[offset:offset+4], p.YCoord)
	offset += 4
	
	// 文本内容 (可变长度)
	copy(buf[offset:offset+len(p.Text)], p.Text)
	offset += len(p.Text)
	
	// 保留字节 (4字节)
	copy(buf[offset:offset+4], p.Reserved[:])
	offset += 4
	
	// 校验和 (2字节，小端序)
	binary.LittleEndian.PutUint16(buf[offset:offset+2], p.Checksum)
	offset += 2
	
	// 停止位 (2字节)
	copy(buf[offset:offset+2], p.StopMarker[:])
	
	return buf
}

// Unmarshal 从字节数组反序列化数据包
func Unmarshal(data []byte) (*Packet, error) {
	if len(data) < MinPacketSize {
		return nil, fmt.Errorf("数据包过短: 收到 %d 字节，至少需要 %d 字节", len(data), MinPacketSize)
	}
	
	packet := &Packet{}
	offset := 0
	
	// 起始位 (4字节)
	copy(packet.StartMarker[:], data[offset:offset+4])
	if packet.StartMarker[0] != StartMarker1 || packet.StartMarker[1] != StartMarker2 ||
		packet.StartMarker[2] != StartMarker3 || packet.StartMarker[3] != StartMarker4 {
		return nil, fmt.Errorf("无效的起始位: %v", packet.StartMarker)
	}
	offset += 4
	
	// 序列号 (2字节，小端序)
	packet.Sequence = binary.LittleEndian.Uint16(data[offset : offset+2])
	offset += 2
	
	// 数据包类型 (1字节)
	packet.PacketType = data[offset]
	if packet.PacketType != PacketType {
		return nil, fmt.Errorf("无效的数据包类型: 0x%02X", packet.PacketType)
	}
	offset += 1
	
	// 数据包长度 (4字节，小端序)
	packet.PacketLength = binary.LittleEndian.Uint32(data[offset : offset+4])
	offset += 4
	
	// 验证数据包长度
	if len(data) != int(packet.PacketLength) {
		return nil, fmt.Errorf("数据包长度不匹配: 声明 %d 字节，实际 %d 字节", packet.PacketLength, len(data))
	}
	
	// 字体名称 (32字节)
	copy(packet.FontName[:], data[offset:offset+32])
	offset += 32
	
	// 字号 (4字节，小端序)
	packet.FontSize = binary.LittleEndian.Uint32(data[offset : offset+4])
	offset += 4
	
	// 字宽 (4字节，小端序)
	packet.FontWidth = binary.LittleEndian.Uint32(data[offset : offset+4])
	offset += 4
	
	// 字间隔 (4字节，小端序)
	packet.CharSpacing = binary.LittleEndian.Uint32(data[offset : offset+4])
	offset += 4
	
	// 旋转角度 (4字节，小端序)
	packet.Rotation = binary.LittleEndian.Uint32(data[offset : offset+4])
	offset += 4
	
	// 加粗 (4字节，小端序)
	packet.Bold = binary.LittleEndian.Uint32(data[offset : offset+4])
	offset += 4
	
	// 斜体 (4字节，小端序)
	packet.Italic = binary.LittleEndian.Uint32(data[offset : offset+4])
	offset += 4
	
	// 样式 (4字节，小端序)
	packet.Style = binary.LittleEndian.Uint32(data[offset : offset+4])
	offset += 4
	
	// X坐标 (4字节，小端序)
	packet.XCoord = binary.LittleEndian.Uint32(data[offset : offset+4])
	offset += 4
	
	// Y坐标 (4字节，小端序)
	packet.YCoord = binary.LittleEndian.Uint32(data[offset : offset+4])
	offset += 4
	
	// 计算文本长度
	textLen := int(packet.PacketLength) - MinPacketSize
	if textLen < 0 {
		return nil, fmt.Errorf("无效的文本长度: %d", textLen)
	}
	
	// 文本内容 (可变长度)
	if textLen > 0 {
		packet.Text = make([]byte, textLen)
		copy(packet.Text, data[offset:offset+textLen])
		offset += textLen
	}
	
	// 保留字节 (4字节)
	copy(packet.Reserved[:], data[offset:offset+4])
	offset += 4
	
	// 校验和 (2字节，小端序)
	packet.Checksum = binary.LittleEndian.Uint16(data[offset : offset+2])
	offset += 2
	
	// 停止位 (2字节)
	copy(packet.StopMarker[:], data[offset:offset+2])
	if packet.StopMarker[0] != StopMarker1 || packet.StopMarker[1] != StopMarker2 {
		return nil, fmt.Errorf("无效的停止位: %v", packet.StopMarker)
	}
	
	// 验证校验和
	expectedChecksum := packet.calculateChecksum()
	if packet.Checksum != expectedChecksum {
		return nil, fmt.Errorf("校验和不匹配: 期望 0x%04X，收到 0x%04X", expectedChecksum, packet.Checksum)
	}
	
	return packet, nil
}